/**************************************************************************//**
 * @item     CosyOS-II Kernel
 * @file     sv_int_pend_flag.c
 * @brief    中断挂起服务_FLAG
 * @details  仅在 pendsv_hook 中调用并执行。
 * @author   迟凯峰
 * @version  V3.1.0
 * @date     2024.11.11
 ******************************************************************************/

#include "os_link.h"
#if SYSCFG_PENDSVHOOK == __ENABLED__

/**
 @addtogroup CosyOS_内核服务
 @{
 *//**
 \defgroup   中断挂起服务_FLAG
 \brief      当需要在中断中完成特定的服务功能时，可先设置一个标志位，再触发 PendSV；
             而后在 pendsv_hook 中查询该标志位，为真就清除标志位，而后调用服务。
 @{
 */

/**
 \brief      恢复任务
 \param[in]  htask     任务句柄
 \return     无
 */
void sp_resume_task(s_tasknode_tsp htask) MCUCFG_C51USING
{
	if(htask == OS_NULL) return;
	if(htask->status & OS_STATUS_SUSPENDED){
		htask->status &= (~OS_STATUS_SUSPENDED & 0xFF);
		s_switch_ready(htask);
	}
}

/**
 \brief      挂起任务
 \param[in]  htask     任务句柄
 \return     无
 */
void sp_suspend_task(s_tasknode_tsp htask) MCUCFG_C51USING
{
	if(htask == OS_NULL) return;
	if(htask->status < OS_STATUS_SUSPENDED){
		htask->status |= OS_STATUS_SUSPENDED;
		if(htask == s_task_current){
			s_sign_schedule = true;
		}
	}
}

/**
 \brief      删除任务
 \param[in]  htask     任务句柄
 \return     无
 */
void sp_delete_task(s_tasknode_tsp htask) MCUCFG_C51USING
{
	if(htask == OS_NULL) return;
	if(htask->status < OS_STATUS_DELETED){
		htask->status = OS_STATUS_DELETED;
		if(htask == s_task_current){
			s_sign_schedule = true;
		}
	}
}

/**
 \brief      设置任务优先级
 \param[in]  htask     任务句柄
 \param[in]  pri       任务优先级
 \return     无
 */
void sp_set_taskpri(s_tasknode_tsp htask, s_u8_t pri) MCUCFG_C51USING
{
	if(htask == OS_NULL) return;
	if(htask->status < OS_STATUS_STOPPED){
		if(htask->pri != pri){
			htask->pri = pri;
			s_set_taskpri(htask);
			s_sign_schedule = true;
		}
	}
}

/**
 \brief      设置阻塞（时间）
 \param[in]  htask     任务句柄
 \param[in]  tick      阻塞时间 [单位：滴答周期，0：等效于清除阻塞，~0：无限阻塞]
 \return     无
 */
void sp_set_block(s_tasknode_tsp htask, s_delay_t tick) MCUCFG_C51USING
{
	if(htask == OS_NULL) return;
	if(htask->status == OS_STATUS_BLOCKED || htask->status == OS_STATUS_FLOATING){
		if(!tick){
			htask->status = OS_STATUS_READY;
			s_switch_taskpri(htask);
		}
		htask->timer = tick;
	}
}

/**
 \brief      清除阻塞（状态）
 \param[in]  htask     任务句柄
 \return     无
 */
void sp_clear_block(s_tasknode_tsp htask) MCUCFG_C51USING
{
	if(htask == OS_NULL) return;
	if(htask->status == OS_STATUS_BLOCKED || htask->status == OS_STATUS_FLOATING){
		htask->status = OS_STATUS_READY;
		htask->timer = 0;
		s_switch_taskpri(htask);
	}
}

#if SYSCFG_BINARY == __ENABLED__
/**
 \brief      上锁or给予二值信号量
 \param[in]  hbin      二值信号量句柄
 \param[in]  val       0：上锁，1：给予
 \return     无
 */
void sp_write_binary(s_binary_tsp hbin, s_bool_t val) MCUCFG_C51USING
{
	hbin->binary = val;
	if(!val) return;
	s_switch_notnull(hbin->htask);
}
#endif

/** @} */
/** @} */
#endif
